<?php
#########################################
#	BROSSEAU VALENTIN 2008		#
#	LIBRAIRIE DE TEMPLATE		#
#		V4.0			#
#					#
#    valentin.brosseau@mesmails.info	#
#########################################


class Template 
{
 
  var $version = "4.0";
  
  var $debug_mode;
  
  var $classname = "Template";
  
  var $fichiers_templates  = array();
  var $vars_templates  = array();
  var $vars_blocks = array();
  
  // Constructeur 
  function Template($debug_mode = 0) 
  {
  	$this->debug_mode=$debug_mode;
  }
  
  function get_version()
  {
	return($this->version);
  }
  
//******************************************************************//
//	set_file(nom du template,emplacement du template)	    //
//******************************************************************//
  
  function set_file($nom_template, $emplacement_template)
  {
  	// Si le fichier de template exsiste
  	if(is_file($emplacement_template))
  		{
  			$this -> fichiers_templates[$nom_template]=file_get_contents($emplacement_template);
  		}
  	else
  		{
  			$this -> debug_message('Erreur: <b>'.$emplacement_template.'</b>  Introuvable.');
  		}
  }
  
//******************************************************************//
//	set_template(nom du template,contenu du template)				//
//******************************************************************//
  
  function set_template($nom_template, $template)
  {
	$this -> fichiers_templates[$nom_template]=$template;
  }
  
  
 
//******************************************************************//
//	set_var(nom de la variable a set,valeur,concatenation (oui/non)	//
//******************************************************************//
  
  function set_var($nom_variable, $valeur = '',$concat='0')
  {
  	if(!is_array($nom_variable))
  	{
  		if(!$concat || !isset($this->vars_templates[$nom_variable]))
  		{
			$this -> vars_templates[$nom_variable] = $valeur;
  		}
  		else
  		{
  			$this -> vars_templates[$nom_variable] .= $valeur;
  		}
  	}
  	
  	else
  	{
  		//Association de tableau. Pour mise un set var depuis un tableau. 
  		$this->vars_templates = $nom_variable + $this->vars_templates;
  	}
  	
  }
  
//******************************************************************//
//	get_var(nom variable)											//
//******************************************************************//
  
  function get_var($nom_variable)
  {
	return ($this->vars_templates[$nom_variable]);
  }
  
//******************************************************************//
//	parse(nom du template,nom variable de destination)				//
//******************************************************************//

  function parse($nom_template,$nomvar='')
  {
  	$chaine = $this -> fichiers_templates[$nom_template];

	reset($this -> vars_templates);
	
	// Evalue la chaine, execute la fonction php a l'interieur
	$chaine = preg_replace("/{([^ \t\r\n}{]+)\(([^ \t\r\n}{]+)\)}/e","\\1(\$this->get_var('\\2'))",$chaine);
	// equivalent a un boucle while qui passe toute les variable et clef d'un tableau while(list($k, $v) = each($this -> vars_templates)) et les remplaces
	$chaine = preg_replace("/{([^ \t\r\n}]+)}/e",'$this->get_var(\'\1\')',$chaine);

        // Gestion des blocks conditionnels
        $chaine = preg_replace("/<!-- IF (.*) -->(.*)<!-- FI -->/em",'$this -> verif("\1","\2")',$chaine);

        
	// On reinjecte apres avoir remplacer toute les variables
	$this -> fichiers_templates[$nom_template] = $chaine;
	
	// si $nomvar est definie, on reinjecte le template parser dans la variable $nomvar.
	if	($nomvar!='')
	{
		$this->set_var($nomvar,$chaine);
	}
  }
  
//**************************************************************//
//	DEBUT - GESTION BLOCK										//
//**************************************************************//

		//********************************************************************//
		//	DEBUT Gestion automatique des block (!!!!! Experimental !!!!!!!)  //
		//********************************************************************//
		
			function set_all_block($nom_template)
			{
				$chaine = $this->fichiers_templates[$nom_template];
				
				$chaine = preg_replace('/<!-- BEGIN ([^ ]+) -->(.*?)<!-- END (\1) -->/es','$this->auto_set_block("\1","\2")',$chaine);
				
				$this->fichiers_templates[$nom_template] = $chaine;
			}
			
			function auto_set_block($titre_block,$valeur_block)
			{
				if (preg_match('/<!-- BEGIN ([^ ]+) -->(.*?)<!-- END (\1) -->/es',$valeur_block))
				{
					$valeur_block=$this->test_si_block($valeur_block);
				}
		
				$this -> vars_blocks[$titre_block]=$valeur_block;		
				return('{'.$titre_block.'}');
		
			}
			
			function test_si_block($chaine)
			{
				return (preg_replace('/<!-- BEGIN ([^ ]+) -->(.*?)<!-- END (\1) -->/es','$this->auto_set_block("\1","\2")',$chaine));
			}
			
		//******************************************************************//
		//	FIN Gestion automatique des block (!!!!! Experimental !!!!!!!)  //
		//******************************************************************//


	function set_block($nom_template,$nom_block)
	{
		$chaine = $this->fichiers_templates[$nom_template];
		// recuperation du contenu du block
		$in=explode('<!-- BEGIN '.$nom_block.' -->', $chaine);
		$in_2=explode('<!-- END '.$nom_block.' -->', $in[1]);
		$this -> vars_blocks[$nom_block] = $in_2[0];
		$this -> fichiers_templates[$nom_template] = $in[0].'{'.$nom_block.'}'.$in_2[1];
	}
	
	function get_block($nom_block)
	{
		return($this->vars_blocks[$nom_block]);
	}
	
	function reset_block($nom_block)
	{
		$this->set_var($nom_block,'');
	}
	
	function add_block($nom_block,$efface =false )
	{
		if ($efface)
		{
			$this->set_var($nom_block,$this->vars_blocks[$nom_block]);
		}
		else
		{
			$this->set_var($nom_block,$this->vars_blocks[$nom_block],'1');
		}
		
		// Mise a jour des variables a l'interrieur du block.
		reset($this -> vars_templates);
		
		// On recupere le contenu du block
		$chaine = $this->get_var($nom_block);
		
		// Evalue la chaine, et execute les ou la fonction php a l'interieur.
		$chaine = preg_replace("/{([^ \t\r\n}{]+)\(([^ \t\r\n}{]+)\)}/e","\\1(\$this->get_var('\\2'))",$chaine);
		
		// On remplace les variable correspondante au block en cours, par leur valeur // equivalent a un boucle while qui passe toute les variable et clef d'un tableau while(list($k, $v) = each($this -> vars_templates)) et les remplaces
		$chaine = preg_replace("/{([^ \t\r\n}]+)}/e","\$this->get_var('\\1')",$chaine);

		// On envoi la nouvelle chaine dans le block.
		$this->set_var($nom_block,$chaine);
	}
	
	function array_to_block($array,$nomblock,$nomtemplate='')
	{

		//Si le block n'exsiste pas on le créer. // Block existant si il existe une clef dans l'array correpondant a $nomblock.
		if(!isset($this -> vars_blocks[$nomblock]))
		{
			if($nomtemplate!='')
			{
				$this->set_block($nomtemplate,$nomblock);
			}
			else
			{
				$this->debug_message('Votre block &eacute;tait inexistant, si vous souhaiter le cr&eacute;er il faut aussi passer le nom du template en cours.');
			}
		}
		
		// Si c'est un tableau on va le parcourir.
		if(is_array($array))
		{
			$this->reset_block($nomblock);
			for($j=0;$j<sizeof($array);$j++)
    			{
    				$this -> set_var($array[$j]);
    				$this-> add_block($nomblock);
    			}		
		}
		else
		{
			$this->debug_message($array.': Doit etre un tableau.');
		}
	}
	
//******************************************************************//
//	FIN - GESTION BLOCK					    //
//******************************************************************//

//******************************************************************//
//	EN COURS DE DEV - GESTION CONDITIONNEL DES BLOCK            //
//******************************************************************//

function blockcon($nom_template)
{
    // On recupere le contenu du template
    $chaine = $this->fichiers_templates[$nom_template];
    
    // On remplace les blocks conditionnelle par leur valeur UNIQUEMENT si la condition est remplis
    // '(\1)?\'\2\':"";' est équivalent à if(true) return 'aaa'; else return '';
    $this -> fichiers_templates[$nom_template] = preg_replace('/<!-- IF (.*) -->(.*)<!-- FI -->/em','$this -> verif(\'\1\',\'\2\')',$chaine);

}

function verif($if,$res)
{
    return eval('if('.stripslashes($if).') return $res; else return "";'); 
}



//******************************************************************//
//	pparse(nom du template)					    //
//******************************************************************//

  function pparse($nom_template)
  {
  	$this -> parse($nom_template);
  	echo $this -> fichiers_templates[$nom_template];
  }
  

//******************************************************************//
//	Affichage debug						    //
//******************************************************************//

  function debug_message($message)
  {
  	if ($this->debug_mode === 1)
  	{
  		echo "<div style='color:red'>".$message."</div>";
  	}
  }  
}

?>